package com.dycong.common.common;

/**
 * Created by Duke on 2016/9/7.
 */

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.*;

public class SerializableUtils implements Serializable {
    /**
     *  当Server端跟Client端对应的类版本不同时(Server段改变了类，Client端未及时改变)，但是显式声明的'serialVersionUID'相同，
     *  反序列化也是可以运行的，所带来的业务问题就是Client不能读取到新增的业务属性(改变的部分)。显示声明'serialVersionUID'可以避免对象不一致，
     *  但尽量不要以这种方式告诉JVM向上兼容。
     *
     *
     *  todo 静态变量不属于对象，属于类。不能被序列化。还有瞬态的变量也不能被序列化 。序列化会忽略静态变量，即序列化不保存静态变量的状态。静态成员属于类级别的，所以不能序列化。即 序列化的是对象的状态不是类的状态。这里的不能序列化的意思，是序列化信息中不包含这个静态成员域。最上面添加了static后之所以还是输出24是因为该值是JVM加载该类时分配的值。注：transient后的变量也不能序列化
     */

    protected static final Log log = LogFactory.getLog(SerializableUtils.class);

    private static final long serialVersionUID = 1L;/*todo static：该域定义的属性作用于整个类，而非特定的对象。类的属性，不是对象的属性，不会被序列化，但会在类的信息里!*/

    public static void writeObject(Serializable s, String fileName) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
            oos.writeObject(s);
            oos.flush();  //缓冲流
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("Serializable.writeObject error");
        }
    }

    public static Object readObject(String fileName) {
        Object o = null;
        try (ObjectInputStream oin = new ObjectInputStream(new FileInputStream(fileName))) {
            o = oin.readObject();
            oin.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            log.error("Serializable.readObject error: FileNotFound");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            log.error("Serializable.readObject error: ClassNotFound");
        } catch (IOException e) {
            e.printStackTrace();
            log.error("Serializable.readObject error");
        }
        return o;
    }

}